PDF书签 java spire pdf书签怎么降级 您所在的位置:网站首页 adobe pdf书签导出 PDF书签 java spire pdf书签怎么降级

PDF书签 java spire pdf书签怎么降级

2023-06-29 01:23| 来源: 网络整理| 查看: 265

  我觉得修改pdf书签总体来说最方便的方式就是:

    导出pdf书签为文本文件,修改书签文本文件后再导入到pdf中。

1.直接修改pdf书签

  python中比较好用的pdf处理的库是pymupdf:

pip install pymupdf                # pip安装pymupdf库

  让人疑惑的是库名是pymupdf,但是导入库要用 "import fitz"

import fitz                     # 导入pymupdf库 doc = fitz.open("test.pdf")           # 获取一个pdf对象 toc = doc.get_toc()                # get_toc()方法获取pdf对象的书签 print(toc)                      # toc是一个二维的列表。

  get_toc()方法获取的书签是一个为二维列表。如果pdf中只有一条书签。获取到书签将会是下面的这种形式:

out[1]: [[1, '目录', 3]]上面输出的数字1代表的是书签的缩进级别。这个缩进级别数字是最小是1。如果大于1,比如是2,要求上一个书签的缩进仅别必须要小于或者等于2。根据这个规则,第一个书签的缩进仅别必需要是1.字符串"目录"是书签的名字。数字3是书签跳转的页码。

  知道了toc中数据的意义,我们就可以直接按需要修改书签:

toc[0][1] = 'test'                 # 将书签名字"目录"修改为”test“ out[2]: [[1, 'test', 3]]                  # 从终端输出可以看出toc中的数据已经修改成功了 doc.set_toc(toc)                  # 将修改后的书签数据导入到pdf对象中。                            # set_toc()方法具体说是先删除pdf对象的书签数据,再导入给定的书签数据 doc.saveIncr()                   # 保存修改到本地pdf文件中,不需要指定路径。

 

2. 导出pdf书签

  如果pdf中书签很多,直接在命令行中操作很麻烦。最好导出数据为文本文件,在文本文件上手动修改文本文件。又因为书签数据是一个"表格",即二维列表,比较好的方式是导出为csv格式的文件。

import csv with open ("toc.csv","w",newline="") as f:   writer=csv.writer(f,delimiter=";")                   # 在csv中指定用”;“分隔数据   writer.writerows(toc)                          # 将一个二维列表一次写入到csv文件中。注意是writerows而不是writerrows。

  上面代码导出的文件,类似下面的形式:

1;起步;12 2;Git 简史;16 2;Git 基础;16 2;命令行;19

  书签的缩进仅别不是很直观,不方便修改。最好稍微修改一下代码用四个空格代表缩进:

with open ("toc.csv","w",newline="") as f:   writer=csv.writer(f,delimiter=";")   for i in toc:     i[0] = " "*(i[0]-1)                      # 将缩进的数字转换成空格。如果缩进是1,没有空格。如果是2,将2转换成4个空格,以此类推writer.writerows(toc)

  这样。导出的csv文件是下面这种形式,缩进变得很直观:

;起步;12 ;Git 简史;16 ;Git 基础;16 ;命令行;19

  更进一步,我们也可以删除第一个“;”,但是没有多大必要。

3. 修改书签文本文件3.1 修改书签的缩进级别

  直接修改就好了。但还是有一点技巧。

  一般的pdf,我们只需要两个级别的缩进就好了。比如说:pdf中有很多章,需要将这些章设为一级书签;每章中有很多小节,将章中的节设为二级书签。

  此时我们先给每个行前面插入四个空格,然后再删除不需要的缩进。因为章的数目总比节的数目要少。这些都能通过正则替换直接完成,比如在vim中:

:s/^/ ^/g              # 在每行前面插入四个空格 :s/^\s\+\(;第*\+章\)/\1/g       # 删除部分缩进3.2 修改书签跳转页码

  比较常见的情况是,需要将每个书签跳转的页码增加或者减少一个数字。此时,在vim中,可以用n+ctrl+a为每行的第一个数字增加n,n+ctrl+x为每行的第一个数字减少n。也可以在导入书签时在脚本中处理。

  比如在 豆瓣读书上,我们复制了一本书的目录如下:

第一章 性别“女” 001 消失的声音 003 女孩的游戏 013 让我看见你 022 美丽的脆弱 029

  上面的页码数字都是"正文页码”,但是正文的第一页常常不是pdf的第一页,此时就需要将上面的页码数字都增加一个固定数字。

3.3 修改复制而来的书签文本。

  比如我们修改将前面从豆瓣读书上复制来的目录,具体操作步骤是:

先在每一行前面增加一个“;” 。在vim中是执行:s/^/;/g在后面的数字前面增加一个分号。:s/\(\d\+\)$/;\1/g。直接将空格替换成分号不可行,因为书签名字中间也有空格。修改书签跳转页码,每个页码增加一个数字。参看前面。修改缩进。参看前面。

  我们复制而来的书签千差万别,需要根据实际情况进行修改。

4. 导入书签数据第一个问题就是,为了直观看到缩进,我们将代表缩进的数字改为了空格。我们需要在导入书签前将这些空格转换成一个数字,或者导入的时转换成数字,才能导入到pdf中。其次,用csv库读取csv文件为一个列表,一般会将所有字段都视作为一个字符串。pandas读取csv比较方便也更智能,如果csv中某一列所有数据都是数字,将自动视该列为数字而不是字符串。

  因为前面用的csv库,所以导入数据我们也用csv库。

  

with open(toc.csv,"r") as f: reader = csv.reader(f,delimiter = ";")   toc=[]                                   # 定义一个空列表,用来存储书签数据   for i in reader :     toc.append(i)                            # 在列表尾部插入数据   for i in toc :                              # 处理toc中数据,如将一些字符串转为数字     i[2] = int(i[2])                           # 将每行的第三个字段转换成一个数字     i[0] = int(i[0].count(" ")/4+1)                  # 如果toc.csv中的空格没有转换成一个数字执行这一步转换                                         # 统计第一个字段的空格数目,每四个空格将缩进数字加1

导入书签的完整代码:

import fitz import os import csv # 默认书签文本文件文件名是"out_toc.txt" # out_toc.txt中每一行三个字段,第一个字段用每四个空格代表书签的缩进+1 # 默认out_toc.txt和pdf文件在同一目录 # 运行脚本,会提示输入pdf文件路径,可以输入相对路径和绝对路径def pdf_path(): pdf=input("输入pdf路径:") if pdf[0] == "~" : pdf_path = "/home/menghua"+pdf.replace("~","") elif pdf[0] == "." : pdf_path = os.getcwd() + pdf.replace(".","") elif pdf[0] != "/" : pdf_path=os.getcwd() + "/" + pdf else : pdf_path=pdf if os.path.exists(pdf_path) and pdf_path[-3:] == "pdf" : print(pdf_path) return (pdf_path) else : print("pdf文件不存在:"+pdf_path) return(0) if __name__ == "__main__": pdf_path = pdf_path() if pdf_path == 0: os._exit() toc_path = os.path.dirname(pdf_path) + "/" + "out_toc.txt" if os.path.exists(toc_path): with open(toc_path,"r") as f: reader = csv.reader(f,delimiter = ";") toc=[] for i in reader: toc.append(i) for i in toc : i[0] = int(i[0].count(" ")/4+1) i[2] = int(i[2]) else : print("书签文件(" + "out_toc.txt" + ")不存在。") doc = fitz.open(pdf_path) doc.set_toc(toc) #保存修改 doc.saveIncr()

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有